package com.cskaoyan.javse.oop2._1extends._3advantage;

/**
 * 继承的优缺点:
 *
 * 练习：
 * 在一款游戏中，我们设计了三种类型的鸭子，这些鸭子有一些共同的属性，也有共同的行为，比如都可以叫，都会游泳等。
 * 编写程序，描述这些鸭子。
 * 后来，需求更改了，这些鸭子不能游泳了，但是都会飞，怎么改呢？
 * 再后来，需求又改了，新增了一种鸭子，但这个鸭子不会飞，又怎么办呢？
 *
 * 继承的优点:
 *      1.代码复用,少写代码
 *      2.代码复用后,程序的修改就能很快完成,代码的扩展性更好,可维护性更强(继承的主要优点)
 *
 * 继承的缺点:
 *      子类无法选择继承父类的何种成员.父类的修改会严格体现到每一个子类中
 *
 * @since 15:48
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        FirstTypeDuck ftd = new FirstTypeDuck();
        SecondTypeDuck std = new SecondTypeDuck();
        ThirdTypeDuck ttd = new ThirdTypeDuck();
        System.out.println(ftd.age);
        ftd.shout();
        // ttd.swim();
        ftd.fly();
        ttd.fly();

        ForthTypeDuck ftd2 = new ForthTypeDuck();
        ftd2.fly();
    }
}

// 因为存在成员的复用,可以先定义一个父类出来
class DuckFather {
    int age;
    String name;

    public void shout() {
        System.out.println("嘎嘎嘎嘎嘎!");
    }

    /*public void swim() {
        System.out.println("白毛浮绿水,红掌拨清波");
    }*/

    public void fly() {
        System.out.println("我会飞了!");
    }
}

class FirstTypeDuck extends DuckFather {
    // 自己定义成员
}

class SecondTypeDuck extends DuckFather {
    // 自己定义成员
}

class ThirdTypeDuck extends DuckFather {
    // 自己定义成员
}

class ForthTypeDuck extends DuckFather {
    // 方法的重写,子类可以在继承父类方法的基础上,修改父类方法的实现
    @Override
    public void fly() {
        System.out.println("我特殊,我还不会飞!");
    }
}